<?php
/*
 * Table/SiteTable
 * Classe manipulant la Table Site
 */

namespace RHX\Model\Table;

use RHX\Model\Object\Site;
use Zend\Db\Adapter\Adapter;
use Zend\Db\TableGateway\AbstractTableGateway;
use Zend\Db\ResultSet\ResultSet;
use Zend\Db\Sql\Select;

class SiteTable extends AbstractTableGateway {

    /**
     * Nom de la Table
     *
     * @var string Nom de la Table
     */
    protected $table = 'rh_site';

    /**
     * Constructeur
     *
     * @param \Zend\Db\Adapter\Adapter $adapter
     */
    public function __construct(Adapter $adapter) {
	$this->adapter			 = $adapter;
	$this->resultSetPrototype	 = new ResultSet();
	$this->resultSetPrototype->setArrayObjectPrototype(new Site());
	$this->initialize();
    }

    /**
     * Récupérer tous les sites de la Table
     *
     * @param string $order Ordre d'affichage
     * @return Collection
     */
    public function getAll($order = 'id ASC') {
	return $this->select(function(Select $select) use($order) {
			    $select->order($order);
			});
    }

    /**
     * Récupérer les Sites par Page
     *
     * @param string $order Ordre d'affichage
     * @param int $page Numéro de page à afficher
     * @param int $perPage Nombre d'élément à afficher sur une page
     * @return Collection
     */
    public function getSites($order = 'id ASC', $page = 1, $perPage = 30) {
	return $this->select(function(Select $select) use($order, $page, $perPage) {
			    $where = new \Zend\Db\Sql\Where();
			    $where->literal("libelle NOT LIKE ''");
			    $select->where($where);
			    $select->order($order);
			    $offset = ($page - 1) * $perPage;
			    $select->offset($offset);
			    $select->limit($perPage);
			});
    }

    /**
     * Récupérer un Site
     *
     * @param strng $id
     * @return RHX\Model\Object\Site
     * @throws \Exception
     */
    public function get($id) {
	$row = $this->select(array('id' => $id))
		->current();
	if (!$row)
	    throw new \Exception("Erreur 21 : Le Site #$id n'a pas été trouvé");

	return $row;
    }

    /**
     * Sauvegarder dans la base de données un Site
     * Soit en Ajout ou en Edition
     *
     * @param \RHX\Model\Object\Site $site Objet à sauvegarder
     * @return int L'identifiant de l'objet sauvegarder dans la base de données
     * @throws \Exception
     */
    public function save(Site $site) {
        $aFieldSite = array('libelle', 'adresse', 'phone',  'fax', 'mail', 'metro', 'siret', 'tva', 'crt', 'assurance', 'urssaf','medecine_travail', 'centre_visite', 'marche', 'rib', 'photo' );
        
        //fill data
        $data	 = array();
        foreach($aFieldSite as $k => $v){
            $data[$v] = $site->$v;
        }
        
        $dWk = array('lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi', 'dimanche') ;
        foreach($dWk as $k => $v){
            $keyCA = $v. '_prevision_ca';     
            $keyMO = $v. '_main_oeuvre'; 
            $keyNT = $v. '_nb_transaction';        
            
            $data[$keyCA] = $site->$keyCA;
            $data[$keyMO] = $site->$keyMO;
            $data[$keyNT] = $site->$keyNT;
        }
        
        // end fill data
        
	$id	 = (int) $site->id;
	if ($id < 0) {
	    $this->insert($data);
	}
	elseif ($this->get($id)) {
	    $this->update($data, array('id' => $id));
	}
	else {
	    throw new \Exception("Erreur 22 : Le Site #$id n'a pas été sélectionner");
	}
	if ($id < 0)
	    return $this->lastInsertValue;
	else
	    return $id;
    }

    /**
     * Effacer un Site
     *
     * @param int $id
     * @return int Le nombre d'enregistrement affecté par la requête
     */
    public function erase($id) {
	return $this->delete(array('id' => $id));
    }

    /**
     * Récupérer un Tableau Associatif de la liste des Nom des Sites
     * 
     * @param array $append Liste des éléments à insérer avant la liste
     * @param array $exception Liste des éléments à exclure de la liste
     * @return array
     */
    public function getSelectList($append = array(), $exception = array()) {
	$rows	 = $this->select(function(Select $select)use($exception){
	    $where = new \Zend\Db\Sql\Where();
	    foreach($exception as $ex){
		$where->notEqualTo('id', $ex);
	    }
	    $select->where($where);
	    $select->order('id DESC');
	});
	$ret	 = array();
	if(is_array($append)){
	    foreach($append as $elt){
		$ret[] = $elt;
	    }
	}
	foreach ($rows as $site) {
	    $ret[((int)$site->id) + 1] = html_entity_decode($site->libelle);
	}

	return $ret;
    }

    /**
     * Récupérer les sites qui ne sont pas dans le Tableau en Paramètres
     *
     * @param array $exception
     * @return array
     */
    public function getSomeSites($exception = array()) {
	return $this->select(function(Select $select)use($exception) {
			    $where = new \Zend\Db\Sql\Where();
			    foreach ($exception as $ex) {
				$where->notEqualTo('id', $ex);
			    }
			    $select->where($where);
			});
    }
    
}
